#include "gskroundedrectprivate.h"
#include "gsktextureprivate.h"
+static gboolean
+check_variant_type (GVariant *variant,
+ const char *type_string,
+ GError **error)
+{
+ if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (type_string)))
+ {
+ g_set_error (error, GSK_SERIALIZATION_ERROR, GSK_SERIALIZATION_INVALID_DATA,
+ "Wrong variant type, got '%s' but needed '%s",
+ g_variant_get_type_string (variant), type_string);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/*** GSK_COLOR_NODE ***/
typedef struct _GskColorNode GskColorNode;
}
static GskRenderNode *
-gsk_color_node_deserialize (GVariant *variant)
+gsk_color_node_deserialize (GVariant *variant,
+ GError **error)
{
double x, y, w, h;
GdkRGBA color;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_COLOR_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_COLOR_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_COLOR_NODE_VARIANT_TYPE,
}
static GskRenderNode *
-gsk_linear_gradient_node_real_deserialize (GVariant *variant,
- gboolean repeating)
+gsk_linear_gradient_node_real_deserialize (GVariant *variant,
+ gboolean repeating,
+ GError **error)
{
GVariantIter *iter;
double x, y, w, h, start_x, start_y, end_x, end_y;
gsize i, n_stops;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_LINEAR_GRADIENT_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_LINEAR_GRADIENT_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_LINEAR_GRADIENT_NODE_VARIANT_TYPE,
}
static GskRenderNode *
-gsk_linear_gradient_node_deserialize (GVariant *variant)
+gsk_linear_gradient_node_deserialize (GVariant *variant,
+ GError **error)
{
- return gsk_linear_gradient_node_real_deserialize (variant, FALSE);
+ return gsk_linear_gradient_node_real_deserialize (variant, FALSE, error);
}
static GskRenderNode *
-gsk_repeating_linear_gradient_node_deserialize (GVariant *variant)
+gsk_repeating_linear_gradient_node_deserialize (GVariant *variant,
+ GError **error)
{
- return gsk_linear_gradient_node_real_deserialize (variant, TRUE);
+ return gsk_linear_gradient_node_real_deserialize (variant, TRUE, error);
}
static const GskRenderNodeClass GSK_LINEAR_GRADIENT_NODE_CLASS = {
}
static GskRenderNode *
-gsk_border_node_deserialize (GVariant *variant)
+gsk_border_node_deserialize (GVariant *variant,
+ GError **error)
{
double doutline[12], dwidths[4];
GdkRGBA colors[4];
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_BORDER_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_BORDER_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_BORDER_NODE_VARIANT_TYPE,
}
static GskRenderNode *
-gsk_texture_node_deserialize (GVariant *variant)
+gsk_texture_node_deserialize (GVariant *variant,
+ GError **error)
{
GskRenderNode *node;
GskTexture *texture;
GVariant *pixel_variant;
gsize n_pixels;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_TEXTURE_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_TEXTURE_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, "(dddduu@au)",
}
static GskRenderNode *
-gsk_inset_shadow_node_deserialize (GVariant *variant)
+gsk_inset_shadow_node_deserialize (GVariant *variant,
+ GError **error)
{
double doutline[12], dx, dy, spread, radius;
GdkRGBA color;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_INSET_SHADOW_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_INSET_SHADOW_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_INSET_SHADOW_NODE_VARIANT_TYPE,
}
static GskRenderNode *
-gsk_outset_shadow_node_deserialize (GVariant *variant)
+gsk_outset_shadow_node_deserialize (GVariant *variant,
+ GError **error)
{
double doutline[12], dx, dy, spread, radius;
GdkRGBA color;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_OUTSET_SHADOW_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_OUTSET_SHADOW_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_INSET_SHADOW_NODE_VARIANT_TYPE,
const cairo_user_data_key_t gsk_surface_variant_key;
static GskRenderNode *
-gsk_cairo_node_deserialize (GVariant *variant)
+gsk_cairo_node_deserialize (GVariant *variant,
+ GError **error)
{
GskRenderNode *result;
cairo_surface_t *surface;
GVariant *pixel_variant;
gsize n_pixels;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_CAIRO_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_CAIRO_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, "(dddduu@au)",
}
static GskRenderNode *
-gsk_container_node_deserialize (GVariant *variant)
+gsk_container_node_deserialize (GVariant *variant,
+ GError **error)
{
GskRenderNode *result;
GVariantIter iter;
guint32 child_type;
GVariant *child_variant;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_CONTAINER_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_CONTAINER_NODE_VARIANT_TYPE, error))
return NULL;
i = 0;
while (g_variant_iter_loop (&iter, "(uv)", &child_type, &child_variant))
{
- children[i] = gsk_render_node_deserialize_node (child_type, child_variant);
+ children[i] = gsk_render_node_deserialize_node (child_type, child_variant, error);
if (children[i] == NULL)
{
guint j;
}
static GskRenderNode *
-gsk_transform_node_deserialize (GVariant *variant)
+gsk_transform_node_deserialize (GVariant *variant,
+ GError **error)
{
graphene_matrix_t transform;
double mat[16];
GVariant *child_variant;
GskRenderNode *result, *child;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_TRANSFORM_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_TRANSFORM_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_TRANSFORM_NODE_VARIANT_TYPE,
&mat[12], &mat[13], &mat[14], &mat[15],
&child_type, &child_variant);
- child = gsk_render_node_deserialize_node (child_type, child_variant);
+ child = gsk_render_node_deserialize_node (child_type, child_variant, error);
g_variant_unref (child_variant);
if (child == NULL)
}
static GskRenderNode *
-gsk_opacity_node_deserialize (GVariant *variant)
+gsk_opacity_node_deserialize (GVariant *variant,
+ GError **error)
{
double opacity;
guint32 child_type;
GVariant *child_variant;
GskRenderNode *result, *child;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_OPACITY_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_OPACITY_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_OPACITY_NODE_VARIANT_TYPE,
&opacity,
&child_type, &child_variant);
- child = gsk_render_node_deserialize_node (child_type, child_variant);
+ child = gsk_render_node_deserialize_node (child_type, child_variant, error);
g_variant_unref (child_variant);
if (child == NULL)
}
static GskRenderNode *
-gsk_clip_node_deserialize (GVariant *variant)
+gsk_clip_node_deserialize (GVariant *variant,
+ GError **error)
{
double x, y, width, height;
guint32 child_type;
GVariant *child_variant;
GskRenderNode *result, *child;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_CLIP_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_CLIP_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_CLIP_NODE_VARIANT_TYPE,
&x, &y, &width, &height,
&child_type, &child_variant);
- child = gsk_render_node_deserialize_node (child_type, child_variant);
+ child = gsk_render_node_deserialize_node (child_type, child_variant, error);
g_variant_unref (child_variant);
if (child == NULL)
}
static GskRenderNode *
-gsk_rounded_clip_node_deserialize (GVariant *variant)
+gsk_rounded_clip_node_deserialize (GVariant *variant,
+ GError **error)
{
double doutline[12];
guint32 child_type;
GVariant *child_variant;
GskRenderNode *child, *result;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_ROUNDED_CLIP_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_ROUNDED_CLIP_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_ROUNDED_CLIP_NODE_VARIANT_TYPE,
&doutline[8], &doutline[9], &doutline[10], &doutline[11],
&child_type, &child_variant);
- child = gsk_render_node_deserialize_node (child_type, child_variant);
+ child = gsk_render_node_deserialize_node (child_type, child_variant, error);
g_variant_unref (child_variant);
if (child == NULL)
}
static GskRenderNode *
-gsk_shadow_node_deserialize (GVariant *variant)
+gsk_shadow_node_deserialize (GVariant *variant,
+ GError **error)
{
gsize n_shadows;
guint32 child_type;
GVariantIter *iter;
gsize i;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_SHADOW_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_SHADOW_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_SHADOW_NODE_VARIANT_TYPE,
&child_type, &child_variant, &iter);
- child = gsk_render_node_deserialize_node (child_type, child_variant);
+ child = gsk_render_node_deserialize_node (child_type, child_variant, error);
g_variant_unref (child_variant);
if (child == NULL)
}
static GskRenderNode *
-gsk_blend_node_deserialize (GVariant *variant)
+gsk_blend_node_deserialize (GVariant *variant,
+ GError **error)
{
guint32 bottom_child_type, top_child_type, blend_mode;
GVariant *bottom_child_variant, *top_child_variant;
GskRenderNode *bottom_child, *top_child, *result;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_BLEND_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_BLEND_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_BLEND_NODE_VARIANT_TYPE,
&top_child_type, &top_child_variant,
&blend_mode);
- bottom_child = gsk_render_node_deserialize_node (bottom_child_type, bottom_child_variant);
+ bottom_child = gsk_render_node_deserialize_node (bottom_child_type, bottom_child_variant, error);
g_variant_unref (bottom_child_variant);
if (bottom_child == NULL)
{
return NULL;
}
- top_child = gsk_render_node_deserialize_node (top_child_type, top_child_variant);
+ top_child = gsk_render_node_deserialize_node (top_child_type, top_child_variant, error);
g_variant_unref (top_child_variant);
if (top_child == NULL)
{
}
static GskRenderNode *
-gsk_cross_fade_node_deserialize (GVariant *variant)
+gsk_cross_fade_node_deserialize (GVariant *variant,
+ GError **error)
{
guint32 start_child_type, end_child_type;
GVariant *start_child_variant, *end_child_variant;
GskRenderNode *start_child, *end_child, *result;
double progress;
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE (GSK_CROSS_FADE_NODE_VARIANT_TYPE)))
+ if (!check_variant_type (variant, GSK_CROSS_FADE_NODE_VARIANT_TYPE, error))
return NULL;
g_variant_get (variant, GSK_CROSS_FADE_NODE_VARIANT_TYPE,
&end_child_type, &end_child_variant,
&progress);
- start_child = gsk_render_node_deserialize_node (start_child_type, start_child_variant);
+ start_child = gsk_render_node_deserialize_node (start_child_type, start_child_variant, error);
g_variant_unref (start_child_variant);
if (start_child == NULL)
{
return NULL;
}
- end_child = gsk_render_node_deserialize_node (end_child_type, end_child_variant);
+ end_child = gsk_render_node_deserialize_node (end_child_type, end_child_variant, error);
g_variant_unref (end_child_variant);
if (end_child == NULL)
{
};
GskRenderNode *
-gsk_render_node_deserialize_node (GskRenderNodeType type,
- GVariant *variant)
+gsk_render_node_deserialize_node (GskRenderNodeType type,
+ GVariant *variant,
+ GError **error)
{
const GskRenderNodeClass *klass;
GskRenderNode *result;
klass = NULL;
if (klass == NULL)
- return NULL;
+ {
+ g_set_error (error, GSK_SERIALIZATION_ERROR, GSK_SERIALIZATION_INVALID_DATA,
+ "Type %u is not a valid node type", type);
+ return NULL;
+ }
- result = klass->deserialize (variant);
+ result = klass->deserialize (variant, error);
return result;
}